home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / aplictns / dis6502.1 < prev    next >
Text File  |  1988-11-05  |  47KB  |  2,069 lines

  1. Path: xanth!nic.MR.NET!hal!cwjcc!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i053:  dis6502 - disassemble 6502 object code
  5. Message-ID: <10051@swan.ulowell.edu>
  6. Date: 4 Nov 88 22:41:47 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 2058
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: finkel@taurus.BITNET (Udi Finkelstein)
  12. Posting-number: Volume 2, Issue 53
  13. Archive-name: applications/dis6502.1
  14.  
  15. Dis6502 disassembles 6502 binary files.  Binary formats understood
  16. include C64, Atari and boot files.  Equate and control files can be
  17. included to name well-known locations and to control the disassembly
  18. process.  The output includes a cross reference.
  19.  
  20. #    This is a shell archive.
  21. #    Remove everything above and including the cut line.
  22. #    Then run the rest of the file through sh.
  23. #----cut here-----cut here-----cut here-----cut here----#
  24. #!/bin/sh
  25. # shar:    Shell Archiver
  26. #    Run the following text with /bin/sh to create:
  27. #    Makefile
  28. #    Makefile.unix
  29. #    c64.predefs
  30. #    dis.1
  31. #    dis.h
  32. #    dis.notes
  33. #    initopts.c
  34. #    lex.c
  35. #    lex.l
  36. #    main.c
  37. #    print.c
  38. #    ref.c
  39. #    tbl.c
  40. # This archive created: Fri Nov  4 17:33:09 1988
  41. cat << \SHAR_EOF > Makefile
  42. OBJS = main.o initopts.o lex.o ref.o print.o tbl.o
  43. SRCS = dis.h main.c initopts.c lex.l ref.c print.c tbl.c 
  44. CFLAGS = +p -n  -DAMIGA
  45.  
  46.  
  47. dis:        $(OBJS)
  48.         ln -g $(OBJS) -o dis -lcl32
  49.  
  50. tbl.o:        dis.h tbl.c
  51.  
  52. initopts.o:    dis.h initopts.c
  53.  
  54. main.o:        dis.h main.c
  55.  
  56. lex.c:        lex.l
  57.  
  58. lex.o:        lex.c dis.h
  59.  
  60. ref.o:        dis.h ref.c
  61.  
  62. print.o:    dis.h print.c
  63.  
  64. SHAR_EOF
  65. cat << \SHAR_EOF > Makefile.unix
  66. OBJS = main.o initopts.o lex.o ref.o print.o tbl.o
  67. SRCS = dis.h main.c initopts.c lex.l ref.c print.c tbl.c 
  68. CFLAGS = -O
  69.  
  70. dis:        $(OBJS)
  71.         cc $(OBJS) -o dis
  72.  
  73. tbl.o:        dis.h tbl.c
  74.         cc -c tbl.c
  75.  
  76. initopts.o:    dis.h initopts.c
  77.  
  78. main.o:        dis.h main.c
  79.  
  80. lex.o:        lex.c
  81.  
  82. lex.c:        dis.h lex.l
  83.  
  84. ref.o:        dis.h ref.c
  85.  
  86. print.o:    dis.h print.c
  87.  
  88. dis.man:    dis.1
  89.         nroff -man dis.1 > dis.man
  90.  
  91. install:    dis
  92.         cp dis /a/rgb/bin/dis6502
  93.  
  94. clean:
  95.         rm -f $(OBJS) lex.c dis.man
  96.  
  97. clobber:    clean
  98.         rm -f dis
  99.  
  100. ckpt:        $(SRCS)
  101.         ci -l $(SRCS)
  102.  
  103. lint: dis.h main.c initopts.c lex.c ref.c print.c tbl.c 
  104.         lint  dis.h main.c initopts.c lex.c ref.c print.c tbl.c 
  105.  
  106. shar:        Makefile dis.1 $(SRCS)
  107.         shar -f shar Makefile dis.1 $(SRCS)
  108. SHAR_EOF
  109. cat << \SHAR_EOF > c64.predefs
  110. 1    CINT        .EQ    $FF81
  111. 2    IOINIT        .EQ    $FF84
  112. 3    RAMTAS        .EQ    $FF87
  113. 4    RESTOR        .EQ    $FF8A
  114. 5    VECTOR        .EQ    $FF8D
  115. 6    SETMSG        .EQ    $FF90
  116. 7    SECOND        .EQ    $FF93
  117. 8    TKSA        .EQ    $FF96
  118. 9    MEMTOP        .EQ    $FF99
  119. 10    MEMBOT        .EQ    $FF9C
  120. 11    SCNKEY        .EQ    $FF9F
  121. 12    SETTMO        .EQ    $FFA2
  122. 13    ACPTR        .EQ    $FFA5
  123. 14    CIOUT        .EQ    $FFA8
  124. 15    UNTLK        .EQ    $FFAB
  125. 16    UNLSN        .EQ    $FFAE
  126. 17    LISTEN        .EQ    $FFB1
  127. 18    TALK        .EQ    $FFB4
  128. 19    READST        .EQ    $FFB7
  129. 20    SETLFS        .EQ    $FFBA
  130. 21    SETNAM        .EQ    $FFBD
  131. 22    OPEN        .EQ    $FFC0
  132. 23    CLOSE        .EQ    $FFC3
  133. 24    CHKIN        .EQ    $FFC6
  134. 25    CHKOUT        .EQ    $FFC9
  135. 26    CLRCHN        .EQ    $FFCC
  136. 27    CHRIN        .EQ    $FFCF
  137. 28    CHROUT        .EQ    $FFD2
  138. 29    LOAD        .EQ    $FFD5
  139. 30    SAVE        .EQ    $FFD8
  140. 31    SETTIM        .EQ    $FFDB
  141. 32    RDTIME        .EQ    $FFDE
  142. 33    STOP        .EQ    $FFE1
  143. 34    GETIN        .EQ    $FFE4
  144. 35    CLALL        .EQ    $FFE7
  145. 36    UDTIME        .EQ    $FFEA
  146. 37    SCREEN        .EQ    $FFED
  147. 38    PLOT        .EQ    $FFF0
  148. 39    IOBASE        .EQ    $FFF3
  149.  
  150. 40    IERRORLO    .EQ    $0300
  151. 41    IERRORHI    .EQ    $0301
  152. 42    IMAINLO        .EQ    $0302
  153. 43    IMAINHI        .EQ    $0303
  154. 44    ICRNCHLO    .EQ    $0304
  155. 45    ICRNCHHI    .EQ    $0305
  156. 46    IQPLOPLO    .EQ    $0306
  157. 47    IQPLOPHI    .EQ    $0307
  158. 48    IGONELO        .EQ    $0308
  159. 49    IGONEHI        .EQ    $0309
  160. 50    IEVALLO        .EQ    $030A
  161. 51    IEVALHI        .EQ    $030B
  162. 52    SAREG        .EQ    $030C
  163. 53    SXREG        .EQ    $030D
  164. 54    SYREG        .EQ    $030E
  165. 55    SPREG        .EQ    $030F
  166. 56    USRPOK        .EQ    $0310
  167. 57    USRADDLO    .EQ    $0311
  168. 58    USRADDHI    .EQ    $0312
  169. 59    CINVLO        .EQ    $0314
  170. 60    CINVHI        .EQ    $0315
  171. 61    CBINVLO        .EQ    $0316
  172. 62    CBINVHI        .EQ    $0317
  173. 63    NMINVLO        .EQ    $0318
  174. 64    NMINVHI        .EQ    $0319
  175. 65    IOPENLO        .EQ    $031A
  176. 66    IOPENHI        .EQ    $031B
  177. 67    ICLOSELO    .EQ    $031C
  178. 68    ICLOSEHI    .EQ    $031D
  179. 69    ICKINLO        .EQ    $031E
  180. 70    ICKINHI        .EQ    $031F
  181. 71    ICKOUTLO    .EQ    $0320
  182. 72    ICKOUTHI    .EQ    $0321
  183. 73    ICLRCHLO    .EQ    $0322
  184. 74    ICLRCHHI    .EQ    $0323
  185. 75    IBASINLO    .EQ    $0324
  186. 76    IBASINHI    .EQ    $0325
  187. 77    IBSOUTLO    .EQ    $0326
  188. 78    IBSOUTHI    .EQ    $0327
  189. 79    ISTOPLO        .EQ    $0328
  190. 80    ISTOPHI        .EQ    $0329
  191. 81    IGETINLO    .EQ    $032A
  192. 82    IGETINHI    .EQ    $032B
  193. 83    ICLALLLO    .EQ    $032C
  194. 84    ICLALLHI    .EQ    $032D
  195. 85    USRCMDLO    .EQ    $032E
  196. 86    USRCMDHI    .EQ    $032F
  197. 87    ILOADLO        .EQ    $0330
  198. 88    ILOADHI        .EQ    $0331
  199. 89    ISAVELO        .EQ    $0332
  200. 90    ISAVEHI        .EQ    $0333
  201.  
  202. 91    TBUFFER        .EQ    $033C
  203. 92    VICSCN        .EQ    $0400
  204. SHAR_EOF
  205. cat << \SHAR_EOF > dis.1
  206. .TH DIS6502 1 "1 OCT 1986"
  207. .UC 4
  208. .SH NAME
  209. dis6502 \- Disassemble 6502 object code
  210. .SH SYNOPSIS
  211. .I dis6502
  212. [
  213. .I \-b 
  214. ]
  215. [
  216. .I -p \fIpfile\fP 
  217. ]
  218. .I file
  219. .LP
  220. .SH DESCRIPTION
  221. .I  Dis6502
  222. disassembles 6502 binary files.  Binary formats understood include
  223. Atari binary files (L menu command) and boot files.
  224. Equate and control files can be included via the
  225. .I -p
  226. option to name well known locations and to control the disassembly
  227. process.  The output includes a cross reference.
  228. .PP
  229. The disassembly process is a two pass operation:  First the program
  230. flow is traced starting with the init and run parameters in the file
  231. headers.  The dump routine then prints out the information.
  232. .PP
  233. The command line options are:
  234. .TP
  235. .I \-b
  236. Assume that the file is a boot file, not a load file.
  237. .TP
  238. .I \-p \fIpfile\fP 
  239. Read in the predefine file \fIpfile\fP.
  240. Up to 20 \fI-p\fP options may be included.
  241. .PP
  242. Lines in pfile consist of:
  243. .PP
  244.  lineno name .eq number
  245. .PP
  246.  .stop number
  247. .PP
  248.  .trace number
  249. .PP 
  250. .I Lineno
  251. refers to a decimal number.  
  252. .I Number 
  253. may be a decimal number or
  254. may be a hexadecimal number (the first character of the number
  255. should be "$").  For example, "$21b5" is
  256. the hexadecimal number 21b5.
  257. .I Name
  258. is a sequence of numbers and characters starting with a
  259. letter.
  260. .I .trace 
  261. causes
  262. the trace process to continue at the address given.  
  263. .I .stop
  264. causes the
  265. trace process to stop at the address given.
  266. .SH AUTHOR
  267. Robert Bond
  268. .SH BUGS
  269. SHAR_EOF
  270. cat << \SHAR_EOF > dis.h
  271. #include <stdio.h>
  272.  
  273. #define NPREDEF 10
  274.  
  275. extern char *predef[];
  276. extern int  npredef;
  277. extern char *file;
  278. extern char *progname;
  279. extern int  bopt;
  280. #ifndef AMIGA
  281. extern unsigned char f[];
  282. extern unsigned char d[];
  283. #else
  284. extern unsigned char *d,*f;
  285. #endif
  286.  
  287. #define getword(x) (d[x] + (d[x+1] << 8))
  288. #define getbyte(x) (d[x])
  289.  
  290. /* f bits */
  291.  
  292. #define LOADED 1            /* Location loaded */
  293. #define JREF   2            /* Referenced as jump/branch dest */
  294. #define DREF   4            /* Referenced as data */
  295. #define SREF   8            /* Referenced as subroutine dest */
  296. #define NAMED  0x10            /* Has a name */
  297. #define TDONE  0x20            /* Has been traced */
  298. #define ISOP   0x40            /* Is a valid instruction opcode */
  299.  
  300. struct info {
  301.     char opn[4];
  302.     int  nb;
  303.     int  flag;
  304. };
  305.  
  306. extern struct info optbl[];
  307.  
  308. /* Flags */
  309.  
  310. /* Where control goes */
  311.  
  312. #define NORM 1
  313. #define JUMP 2
  314. #define FORK 4
  315. #define STOP 8
  316.  
  317. #define CTLMASK (NORM|JUMP|FORK|STOP)
  318.  
  319. /* Instruction format */
  320.  
  321. #define IMM  0x20
  322. #define ABS  0x40
  323. #define ACC  0x80
  324. #define IMP  0x100
  325. #define INX  0x200
  326. #define INY  0x400
  327. #define ZPX  0x800
  328. #define ABX  0x1000
  329. #define ABY  0x2000
  330. #define REL  0x4000
  331. #define IND  0x8000
  332. #define ZPY  0x10000
  333. #define ZPG  0x20000
  334. #define ILL  0x40000
  335.  
  336. #define ADRMASK (IMM|ABS|ACC|IMP|INX|INY|ZPX|ABX|ABY|REL|IND|ZPY|ZPG|ILL)
  337.  
  338. struct ref_chain {
  339.     struct ref_chain *next;
  340.     int who;
  341. };
  342.  
  343. struct ref_chain *get_ref();
  344. char *get_name();
  345.  
  346. /* lex junk */
  347.  
  348. #define EQ 256
  349. #define NUMBER 257
  350. #define NAME 258
  351. #define COMMENT 259
  352. #define LI 260
  353. #define TSTART 261
  354. #define TSTOP 262
  355.  
  356. extern FILE *yyin, *yyout;
  357. int lineno;
  358.  
  359. int yywrap(), yyerror();
  360. char *emalloc();
  361.  
  362. typedef union  {
  363.     int ival;
  364.     char *sval;
  365. } VALUE;
  366.  
  367. extern VALUE token;
  368. SHAR_EOF
  369. cat << \SHAR_EOF > dis.notes
  370.  
  371.  
  372.  
  373.        Some notes about Robert Bond's 'dis' program, Amiga version.
  374.  
  375.  
  376.  
  377. This  is a quick & dirty port of a 6502 reverse assembler I that I had under
  378. my  hand  for a long time.  I didn't bother optimizing the stuff too much, I
  379. just  wanted to see it working.  This is the sort of 'dirty' ports where you
  380. first  compiler  the  original file, then watch the compiler errors, and fix
  381. the errors in the file, without looking anywhere else in it.  Therefor:
  382.  
  383. 1)  'dis'  requires  C:Sort  (  too much bother to replace ) & C:Type ( I AM
  384.     lazy!!!)
  385.  
  386. 2)  I  still  don't  understand  why  are  the  line  numbers  needed in the
  387.     c64.predef file. I don't have much UNIX experience, and no experience at
  388.     all with lex. lex code is like chinese to  me, but  reading  the  perdef
  389.     I think that the line numbers are ignored and are used  only  to  easily
  390.     identify '.eq' lines.
  391.  
  392. 3)  The program  is recursive, too  much recursive!  the trace routine calls
  393.     itself not only on branches, but every instruction! large stacks (  even
  394.     50K isn't too much for large programs ), are welcomed... I  will  modify
  395.     this as soon as I'll have time. it should be easy to remove recursion in
  396.     the non branch/jmp instructions. branches must have recursion.
  397.  
  398. I also enhanced the original package, and added support for c64 binary file,
  399. which  wasn't there before.  ( It had only ATARI load/boot files ).  The C64
  400. file format was much simpler than those other 2 formats.  To select C64 file
  401. format, use the '-c' flag.  I also included a c64.predefs file with some C64
  402. constant  addresses.  Also, FYI, lex.c was generated on a SUN from lex.l and
  403. then downloaded to the Amiga.  lex.c was also __edited__ before compilation.
  404. I  know  that  it's  a  no-no  to  edit  machine-generated files, but it was
  405. necessary.
  406.  
  407.  
  408. Udi Finkelstein
  409.  
  410. 10 Glitzenstein st.
  411. Tel Aviv 64686 Israel
  412. Phone: 972-3-263-927
  413.  
  414. BITNET:     finkel@taurus.BITNET                     ( Best )
  415. UUCP:       ...!uunet!ulysses!attibr!althea!finkel   ( Try avoiding this )
  416. ARPA:       finkel%taurus@cunyvm.cuny.edu            ( Same as BITNET )
  417. FIDO:       Udi Finkelstein ( At 2:40/117 or 2:40/135
  418.                               If you can get there at all!)
  419. SHAR_EOF
  420. cat << \SHAR_EOF > initopts.c
  421.  
  422. /* 
  423.  * 
  424.  *  dis [-p predefineds] file
  425.  *
  426.  *  The -p option may be repeated.
  427.  */
  428.  
  429. #include "dis.h"
  430.  
  431. char *predef[NPREDEF];
  432. int  npredef = 0;
  433. char *file;
  434. char *progname = "dis";
  435. int  bopt = 0;
  436.  
  437. initopts(argc,argv)
  438. int argc;
  439. char *argv[];
  440. {
  441.     int ai;
  442.     char *ca;
  443.     int fileset = 0;
  444.  
  445.     progname = argv[0];
  446.  
  447.     while (--argc) {
  448.         if ((*++argv)[0] == '-') {
  449.         ca = *argv;
  450.         for(ai = 1; ca[ai] != '\0'; ai++)
  451.                 switch (ca[ai]) {
  452.                 case 'p':
  453.             predef[npredef] = *++argv;
  454.             npredef++;
  455.                     argc--;
  456.                     break;
  457.         case 'b':
  458.             bopt = 1;
  459.             break;
  460.  
  461.         case 'c':
  462.             bopt = 2;
  463.             break;
  464.                 default: crash("Invalid option letter");
  465.                 }
  466.         } else if (!fileset) {
  467.         file = *argv;
  468.         fileset++;
  469.     } else crash("Usage: [-{c|b}] [-p predef] file");
  470.     }
  471.     if (!fileset)
  472.      crash("Usage: [-{c|b}] [-p predef] file");
  473. }
  474. SHAR_EOF
  475. cat << \SHAR_EOF > lex.c
  476. # include "stdio.h"
  477. # define U(x) x
  478. # define NLSTATE yyprevious=YYNEWLINE
  479. # define BEGIN yybgin = yysvec + 1 +
  480. # define INITIAL 0
  481. # define YYLERR yysvec
  482. # define YYSTATE (yyestate-yysvec-1)
  483. # define YYOPTIM 1
  484. # define YYLMAX BUFSIZ
  485. # define output(c) putc(c,yyout)
  486. # define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
  487. # define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
  488. # define yymore() (yymorfg=1)
  489. # define ECHO fprintf(yyout, "%s",yytext)
  490. # define REJECT { nstr = yyreject(); goto yyfussy;}
  491. int yyleng; extern char yytext[];
  492. int yymorfg;
  493. extern char *yysptr, yysbuf[];
  494. int yytchar;
  495. FILE *yyin = {stdin}, *yyout = {stdout};
  496. extern int yylineno;
  497. struct yysvf { 
  498.     struct yywork *yystoff;
  499.     struct yysvf *yyother;
  500.     int *yystops;};
  501. struct yysvf *yyestate;
  502. extern struct yysvf yysvec[], *yybgin;
  503. #undef ECHO
  504. #include "dis.h"
  505. #ifndef AMIGA
  506. int lineno = 0;
  507. #endif
  508. char *strcpy();
  509. # define YYNEWLINE 10
  510. yylex(){
  511. int nstr; extern int yyprevious;
  512. while((nstr = yylook()) >= 0)
  513. yyfussy: switch(nstr){
  514. case 0:
  515. if(yywrap()) return(0); break;
  516. case 1:
  517. { ; }
  518. break;
  519. case 2:
  520. {    lineno++;
  521.                 return '\n';
  522. }
  523. break;
  524. case 3:
  525.                 return EQ;
  526. }
  527. break;
  528. case 4:
  529.                 return LI;
  530. }
  531. break;
  532. case 5:
  533.                 return EQ;
  534. }
  535. break;
  536. case 6:
  537.                 return LI;
  538. }
  539. break;
  540. case 7:
  541. {
  542.                 return TSTART;
  543. }
  544. break;
  545. case 8:
  546. {
  547.                 return TSTOP;
  548. }
  549. break;
  550. case 9:
  551. {
  552.                 (void)sscanf(yytext, "%d", &token.ival); 
  553.                 return NUMBER;
  554. }
  555. break;
  556. case 10:
  557. {
  558.                 (void)sscanf(yytext+1, "%x", &token.ival);
  559.                 return NUMBER;
  560. }
  561. break;
  562. case 11:
  563. {
  564.                 token.sval = emalloc((unsigned) strlen(yytext)+1);
  565.                 (void)strcpy((char *)token.sval, (char *)yytext);
  566.                 return NAME;
  567. }
  568. break;
  569. case 12:
  570. {
  571.                 return COMMENT;
  572. }
  573. break;
  574. case 13:
  575.         { return yytext[0]; }
  576. break;
  577. case -1:
  578. break;
  579. default:
  580. fprintf(yyout,"bad switch yylook %d",nstr);
  581. } return(0); }
  582. /* end of yylex */
  583.  
  584. char *
  585. emalloc(n)
  586. unsigned n;
  587. {
  588.     char *ptr, *malloc();
  589.  
  590.     if ((ptr = malloc(n)) == (char *) 0) {
  591.         (void) fprintf(stderr,"out of core");
  592.         exit(1);
  593.     }
  594.     return ptr;
  595. }
  596. int yyvstop[] = {
  597. 0,
  598.  
  599. 13,
  600. 0,
  601.  
  602. 1,
  603. 13,
  604. 0,
  605.  
  606. 2,
  607. 0,
  608.  
  609. 13,
  610. 0,
  611.  
  612. 12,
  613. 13,
  614. 0,
  615.  
  616. 13,
  617. 0,
  618.  
  619. 9,
  620. 13,
  621. 0,
  622.  
  623. 11,
  624. 13,
  625. 0,
  626.  
  627. 10,
  628. 0,
  629.  
  630. 12,
  631. 0,
  632.  
  633. 9,
  634. 0,
  635.  
  636. 11,
  637. 0,
  638.  
  639. 3,
  640. 0,
  641.  
  642. 4,
  643. 0,
  644.  
  645. 5,
  646. 0,
  647.  
  648. 6,
  649. 0,
  650.  
  651. 8,
  652. 0,
  653.  
  654. 7,
  655. 0,
  656. 0};
  657. # define YYTYPE char
  658. struct yywork { YYTYPE verify, advance; } yycrank[] = {
  659. 0,0,    0,0,    1,3,    0,0,    
  660. 0,0,    0,0,    0,0,    0,0,    
  661. 0,0,    0,0,    1,4,    1,5,    
  662. 0,0,    0,0,    0,0,    0,0,    
  663. 0,0,    0,0,    0,0,    0,0,    
  664. 7,12,    0,0,    0,0,    0,0,    
  665. 0,0,    0,0,    0,0,    0,0,    
  666. 7,12,    7,0,    12,0,    0,0,    
  667. 0,0,    0,0,    0,0,    0,0,    
  668. 0,0,    1,6,    2,6,    0,0,    
  669. 0,0,    0,0,    0,0,    1,7,    
  670. 2,7,    0,0,    0,0,    1,8,    
  671. 2,8,    1,9,    0,0,    0,0,    
  672. 0,0,    0,0,    0,0,    0,0,    
  673. 6,11,    6,11,    6,11,    6,11,    
  674. 6,11,    6,11,    6,11,    6,11,    
  675. 6,11,    6,11,    1,10,    7,12,    
  676. 0,0,    0,0,    0,0,    0,0,    
  677. 1,10,    6,11,    6,11,    6,11,    
  678. 6,11,    6,11,    6,11,    8,13,    
  679. 0,0,    0,0,    0,0,    0,0,    
  680. 7,12,    0,0,    8,14,    0,0,    
  681. 0,0,    0,0,    7,12,    0,0,    
  682. 0,0,    14,22,    0,0,    0,0,    
  683. 1,3,    0,0,    0,0,    0,0,    
  684. 0,0,    13,21,    0,0,    0,0,    
  685. 0,0,    6,11,    6,11,    6,11,    
  686. 6,11,    6,11,    6,11,    8,15,    
  687. 0,0,    0,0,    7,12,    0,0,    
  688. 0,0,    0,0,    8,16,    0,0,    
  689. 0,0,    0,0,    26,28,    0,0,    
  690. 0,0,    8,17,    8,18,    9,19,    
  691. 9,19,    9,19,    9,19,    9,19,    
  692. 9,19,    9,19,    9,19,    9,19,    
  693. 9,19,    10,20,    10,20,    10,20,    
  694. 10,20,    10,20,    10,20,    10,20,    
  695. 10,20,    10,20,    10,20,    15,23,    
  696. 16,24,    17,25,    18,26,    25,27,    
  697. 27,29,    28,30,    10,20,    10,20,    
  698. 10,20,    10,20,    10,20,    10,20,    
  699. 10,20,    10,20,    10,20,    10,20,    
  700. 10,20,    10,20,    10,20,    10,20,    
  701. 10,20,    10,20,    10,20,    10,20,    
  702. 10,20,    10,20,    10,20,    10,20,    
  703. 10,20,    10,20,    10,20,    10,20,    
  704. 30,31,    0,0,    0,0,    0,0,    
  705. 10,20,    0,0,    10,20,    10,20,    
  706. 10,20,    10,20,    10,20,    10,20,    
  707. 10,20,    10,20,    10,20,    10,20,    
  708. 10,20,    10,20,    10,20,    10,20,    
  709. 10,20,    10,20,    10,20,    10,20,    
  710. 10,20,    10,20,    10,20,    10,20,    
  711. 10,20,    10,20,    10,20,    10,20,    
  712. 0,0};
  713. struct yysvf yysvec[] = {
  714. 0,    0,    0,
  715. yycrank+-1,    0,        0,    
  716. yycrank+-2,    yysvec+1,    0,    
  717. yycrank+0,    0,        yyvstop+1,
  718. yycrank+0,    0,        yyvstop+3,
  719. yycrank+0,    0,        yyvstop+6,
  720. yycrank+8,    0,        yyvstop+8,
  721. yycrank+-19,    0,        yyvstop+10,
  722. yycrank+10,    0,        yyvstop+13,
  723. yycrank+79,    0,        yyvstop+15,
  724. yycrank+89,    0,        yyvstop+18,
  725. yycrank+0,    yysvec+6,    yyvstop+21,
  726. yycrank+-20,    yysvec+7,    yyvstop+23,
  727. yycrank+20,    0,        0,    
  728. yycrank+20,    0,        0,    
  729. yycrank+34,    0,        0,    
  730. yycrank+43,    0,        0,    
  731. yycrank+33,    0,        0,    
  732. yycrank+36,    0,        0,    
  733. yycrank+0,    yysvec+9,    yyvstop+25,
  734. yycrank+0,    yysvec+10,    yyvstop+27,
  735. yycrank+0,    0,        yyvstop+29,
  736. yycrank+0,    0,        yyvstop+31,
  737. yycrank+0,    0,        yyvstop+33,
  738. yycrank+0,    0,        yyvstop+35,
  739. yycrank+40,    0,        0,    
  740. yycrank+25,    0,        0,    
  741. yycrank+40,    0,        0,    
  742. yycrank+54,    0,        0,    
  743. yycrank+0,    0,        yyvstop+37,
  744. yycrank+79,    0,        0,    
  745. yycrank+0,    0,        yyvstop+39,
  746. 0,    0,    0};
  747. struct yywork *yytop = yycrank+211;
  748. struct yysvf *yybgin = yysvec+1;
  749. char yymatch[] = {
  750. 00  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  751. 01  ,011 ,012 ,01  ,01  ,01  ,01  ,01  ,
  752. 01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  753. 01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  754. 011 ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  755. 01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  756. '0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,
  757. '0' ,'0' ,01  ,01  ,01  ,01  ,01  ,01  ,
  758. 01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'G' ,
  759. 'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,
  760. 'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,
  761. 'G' ,'G' ,'G' ,01  ,01  ,01  ,01  ,'_' ,
  762. 01  ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'G' ,
  763. 'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,
  764. 'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,'G' ,
  765. 'G' ,'G' ,'G' ,01  ,01  ,01  ,01  ,01  ,
  766. 0};
  767. char yyextra[] = {
  768. 0,0,0,0,0,0,0,0,
  769. 0,0,0,0,0,0,0,0,
  770. 0};
  771. #ifndef lint
  772. static    char ncform_sccsid[] = "@(#)ncform 1.2 86/10/08 SMI"; /* from S5R2 1.2 */
  773. #endif
  774.  
  775. int yylineno =1;
  776. # define YYU(x) x
  777. # define NLSTATE yyprevious=YYNEWLINE
  778. char yytext[YYLMAX];
  779. struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
  780. char yysbuf[YYLMAX];
  781. char *yysptr = yysbuf;
  782. int *yyfnd;
  783. extern struct yysvf *yyestate;
  784. int yyprevious = YYNEWLINE;
  785. yylook(){
  786.     register struct yysvf *yystate, **lsp;
  787.     register struct yywork *yyt;
  788.     struct yysvf *yyz;
  789.     int yych, yyfirst;
  790.     struct yywork *yyr;
  791. # ifdef LEXDEBUG
  792.     int debug;
  793. # endif
  794.     char *yylastch;
  795.     /* start off machines */
  796. # ifdef LEXDEBUG
  797.     debug = 0;
  798. # endif
  799.     yyfirst=1;
  800.     if (!yymorfg)
  801.         yylastch = yytext;
  802.     else {
  803.         yymorfg=0;
  804.         yylastch = yytext+yyleng;
  805.         }
  806.     for(;;){
  807.         lsp = yylstate;
  808.         yyestate = yystate = yybgin;
  809.         if (yyprevious==YYNEWLINE) yystate++;
  810.         for (;;){
  811. # ifdef LEXDEBUG
  812.             if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
  813. # endif
  814.             yyt = yystate->yystoff;
  815.             if(yyt == yycrank && !yyfirst){  /* may not be any transitions */
  816.                 yyz = yystate->yyother;
  817.                 if(yyz == 0)break;
  818.                 if(yyz->yystoff == yycrank)break;
  819.                 }
  820.             *yylastch++ = yych = input();
  821.             yyfirst=0;
  822.         tryagain:
  823. # ifdef LEXDEBUG
  824.             if(debug){
  825.                 fprintf(yyout,"char ");
  826.                 allprint(yych);
  827.                 putchar('\n');
  828.                 }
  829. # endif
  830.             yyr = yyt;
  831.             if ( (int)yyt > (int)yycrank){
  832.                 yyt = yyr + yych;
  833.                 if (yyt <= yytop && yyt->verify+yysvec == yystate){
  834.                     if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  835.                         {unput(*--yylastch);break;}
  836.                     *lsp++ = yystate = yyt->advance+yysvec;
  837.                     goto contin;
  838.                     }
  839.                 }
  840. # ifdef YYOPTIM
  841.             else if((int)yyt < (int)yycrank) {        /* r < yycrank */
  842.                 yyt = yyr = yycrank+(yycrank-yyt);
  843. # ifdef LEXDEBUG
  844.                 if(debug)fprintf(yyout,"compressed state\n");
  845. # endif
  846.                 yyt = yyt + yych;
  847.                 if(yyt <= yytop && yyt->verify+yysvec == yystate){
  848.                     if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  849.                         {unput(*--yylastch);break;}
  850.                     *lsp++ = yystate = yyt->advance+yysvec;
  851.                     goto contin;
  852.                     }
  853.                 yyt = yyr + YYU(yymatch[yych]);
  854. # ifdef LEXDEBUG
  855.                 if(debug){
  856.                     fprintf(yyout,"try fall back character ");
  857.                     allprint(YYU(yymatch[yych]));
  858.                     putchar('\n');
  859.                     }
  860. # endif
  861.                 if(yyt <= yytop && yyt->verify+yysvec == yystate){
  862.                     if(yyt->advance+yysvec == YYLERR)    /* error transition */
  863.                         {unput(*--yylastch);break;}
  864.                     *lsp++ = yystate = yyt->advance+yysvec;
  865.                     goto contin;
  866.                     }
  867.                 }
  868.             if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
  869. # ifdef LEXDEBUG
  870.                 if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
  871. # endif
  872.                 goto tryagain;
  873.                 }
  874. # endif
  875.             else
  876.                 {unput(*--yylastch);break;}
  877.         contin:
  878. # ifdef LEXDEBUG
  879.             if(debug){
  880.                 fprintf(yyout,"state %d char ",yystate-yysvec-1);
  881.                 allprint(yych);
  882.                 putchar('\n');
  883.                 }
  884. # endif
  885.             ;
  886.             }
  887. # ifdef LEXDEBUG
  888.         if(debug){
  889.             fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
  890.             allprint(yych);
  891.             putchar('\n');
  892.             }
  893. # endif
  894.         while (lsp-- > yylstate){
  895.             *yylastch-- = 0;
  896.             if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
  897.                 yyolsp = lsp;
  898.                 if(yyextra[*yyfnd]){        /* must backup */
  899.                     while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
  900.                         lsp--;
  901.                         unput(*yylastch--);
  902.                         }
  903.                     }
  904.                 yyprevious = YYU(*yylastch);
  905.                 yylsp = lsp;
  906.                 yyleng = yylastch-yytext+1;
  907.                 yytext[yyleng] = 0;
  908. # ifdef LEXDEBUG
  909.                 if(debug){
  910.                     fprintf(yyout,"\nmatch ");
  911.                     sprint(yytext);
  912.                     fprintf(yyout," action %d\n",*yyfnd);
  913.                     }
  914. # endif
  915.                 return(*yyfnd++);
  916.                 }
  917.             unput(*yylastch);
  918.             }
  919.         if (yytext[0] == 0  /* && feof(yyin) */)
  920.             {
  921.             yysptr=yysbuf;
  922.             return(0);
  923.             }
  924.         yyprevious = yytext[0] = input();
  925.         if (yyprevious>0)
  926.             output(yyprevious);
  927.         yylastch=yytext;
  928. # ifdef LEXDEBUG
  929.         if(debug)putchar('\n');
  930. # endif
  931.         }
  932.     }
  933. yyback(p, m)
  934.     int *p;
  935. {
  936. if (p==0) return(0);
  937. while (*p)
  938.     {
  939.     if (*p++ == m)
  940.         return(1);
  941.     }
  942. return(0);
  943. }
  944.     /* the following are only used in the lex library */
  945. yyinput(){
  946.     return(input());
  947.     }
  948. yyoutput(c)
  949.   int c; {
  950.     output(c);
  951.     }
  952. yyunput(c)
  953.    int c; {
  954.     unput(c);
  955.     }
  956. SHAR_EOF
  957. cat << \SHAR_EOF > lex.l
  958. %{
  959. #undef ECHO
  960. #include "dis.h"
  961. int lineno = 0;
  962. char *strcpy();
  963. %}
  964. %%
  965. [ \t] { ; }
  966. [\n] {    lineno++;
  967.                 return '\n';
  968. }
  969. \.EQ { 
  970.                 return EQ;
  971. }
  972. \.LI { 
  973.                 return LI;
  974. }
  975. \.eq { 
  976.                 return EQ;
  977. }
  978. \.li { 
  979.                 return LI;
  980. }
  981. ".trace" {
  982.                 return TSTART;
  983. }
  984. ".stop" {
  985.                 return TSTOP;
  986. }
  987. [0-9]+    {
  988.                 (void)sscanf(yytext, "%d", &token.ival); 
  989.                 return NUMBER;
  990. }
  991. \$[A-Fa-f0-9]+ {
  992.                 (void)sscanf(yytext+1, "%x", &token.ival);
  993.                 return NUMBER;
  994. }
  995. [A-Za-z][A-Za-z0-9_]* {
  996.                 token.sval = emalloc((unsigned) strlen(yytext)+1);
  997.                 (void)strcpy((char *)token.sval, (char *)yytext);
  998.                 return NAME;
  999. }
  1000. \*.* {
  1001.                 return COMMENT;
  1002. }
  1003. .            { return yytext[0]; }
  1004. %%
  1005.  
  1006. char *
  1007. emalloc(n)
  1008. unsigned n;
  1009. {
  1010.     char *ptr, *malloc();
  1011.  
  1012.     if ((ptr = malloc(n)) == (char *) 0) {
  1013.         (void) fprintf(stderr,"out of core");
  1014.         exit(1);
  1015.     }
  1016.     return ptr;
  1017. }
  1018. SHAR_EOF
  1019. cat << \SHAR_EOF > main.c
  1020. #include "dis.h"
  1021.  
  1022. #define NTSTART 20
  1023.  
  1024. char *cur_file = NULL;            /* the file thats open */
  1025. int  pre_index = 0;
  1026. int  tstart[NTSTART];            /* .trace directive keep locations */
  1027. int  tstarti = 0;
  1028.  
  1029. VALUE token;
  1030.  
  1031. #ifdef AMIGA
  1032. unsigned char *d,*f; /* Manx has a bug preventing us from declaring arrays >64K */
  1033. extern unsigned char *calloc();
  1034. #else
  1035. unsigned char d[0x10000];         /* The data */
  1036. unsigned char f[0x10000];        /* Flags for memory usage */ 
  1037. #endif
  1038.  
  1039. #define RUNLOC  0x2e0
  1040. #define INITLOC 0x2e2
  1041.  
  1042. main(argc, argv)
  1043. int argc;
  1044. char *argv[];
  1045. {
  1046.     int i;
  1047.  
  1048. #ifdef AMIGA
  1049. d = calloc(0x10000,1);
  1050. f = calloc(0x10000,1);
  1051. #endif
  1052.  
  1053.     initopts(argc, argv);
  1054.     if (npredef > 0) {
  1055.         cur_file = predef[0];
  1056.         pre_index++;
  1057.         yyin = fopen(cur_file, "r");
  1058.         if (!yyin)
  1059.             crash ("Cant open predefine file");
  1060.         get_predef();
  1061.     }
  1062.     switch (bopt) {
  1063.         case 0:
  1064.             loadboot();
  1065.             break;
  1066.         case 1:
  1067.             loadfile();
  1068.             break;
  1069.         case 2:
  1070.             c64loadfile();
  1071.             break;
  1072.         }
  1073.     for (i = 0; i<tstarti; i++)
  1074.         start_trace(tstart[i], "*PTRACE*");
  1075.  
  1076.     dumpitout();
  1077.  
  1078. #ifdef AMIGA
  1079. free(d);
  1080. free(f);
  1081. #endif
  1082.  
  1083.     exit(0);
  1084. }
  1085.  
  1086. crash(p)
  1087. char *p;
  1088. {
  1089.     fprintf(stderr, "%s: %s\n", progname, p);
  1090.     if (cur_file != NULL)
  1091.         fprintf(stderr, "Line %d of %s\n", lineno+1, cur_file);
  1092. #ifdef AMIGA
  1093. free(d);
  1094. free(f);
  1095. #endif
  1096.     exit(1);
  1097. }
  1098.  
  1099. get_predef()
  1100. {
  1101.     int loc;
  1102.     char *name;
  1103.  
  1104.     for(;;) 
  1105.         switch (yylex()) {
  1106.         case '\n':
  1107.             break;
  1108.         case 0:
  1109.             return;
  1110.         case TSTART:
  1111.             if (yylex() != NUMBER) 
  1112.                 crash(".trace needs a number operand");
  1113.             loc = token.ival;
  1114.             if (loc > 0x10000 || loc < 0)
  1115.                 crash("Number out of range");
  1116.             if (tstarti == NTSTART) 
  1117.                 crash("Too many .trace directives");
  1118.             tstart[tstarti++] = loc;
  1119.             while (yylex() != '\n')
  1120.                 ;
  1121.             break;
  1122.         case TSTOP:
  1123.             if (yylex() != NUMBER) 
  1124.                 crash(".stop needs a number operand");
  1125.             loc = token.ival;
  1126.             if (loc > 0x10000 || loc < 0)
  1127.                 crash("Number out of range");
  1128.             f[loc] |= TDONE;
  1129.             while (yylex() != '\n')
  1130.                 ;
  1131.             break;
  1132.         case NUMBER:
  1133.             switch (yylex()) {
  1134.             case LI:
  1135.             case COMMENT:
  1136.                 while (yylex() != '\n')
  1137.                     ;
  1138.                 break;
  1139.             case '\n':
  1140.                 break;
  1141.             case NAME:
  1142.                 name = token.sval;
  1143.                 if (yylex() != EQ) 
  1144.                     crash("Only EQ and LI supported in defines file");
  1145.                 if (yylex() != NUMBER)
  1146.                     crash("EQ operand must be a number");
  1147.                 loc = token.ival;
  1148.                 if (loc > 0x10000 || loc < 0)
  1149.                     crash("Number out of range");
  1150.                 f[loc] |= NAMED;
  1151.                 save_name(loc, name); 
  1152.                 while (yylex() != '\n') 
  1153.                     ;
  1154.                 break;
  1155.             default:
  1156.                 crash("Invalid line in predef file");
  1157.             }
  1158.             break;
  1159.         default:
  1160.             crash("Invalid line in predef file");
  1161.         }
  1162. }
  1163.  
  1164. loadboot()
  1165. {
  1166.     struct boot_hdr {
  1167.         unsigned char flags;
  1168.         unsigned char nsec;
  1169.         unsigned char base_low;
  1170.         unsigned char base_hi;
  1171.         unsigned char init_low;
  1172.         unsigned char init_hi;
  1173.     } bh;
  1174.  
  1175.     FILE *fp;
  1176.     int base_addr;
  1177.     register int i;
  1178.     int len;
  1179.  
  1180.     fp = fopen(file, "r");
  1181.     cur_file = NULL;
  1182.     if (!fp) { 
  1183.         fprintf(stderr, "Cant open %s\n", file);
  1184.  
  1185. #ifdef AMIGA
  1186. free(d);
  1187. free(f);
  1188. #endif
  1189.  
  1190.         exit(1);
  1191.     }
  1192.  
  1193.     if(fread((char *)&bh, sizeof(bh), 1, fp) != 1) 
  1194.         crash("Input too short");
  1195.     
  1196.     base_addr = bh.base_low + (bh.base_hi << 8);
  1197.     len = bh.nsec * 128;
  1198.     rewind(fp);
  1199.     if (fread((char *)&d[base_addr], 1, len, fp) != len) 
  1200.         crash("input too short");
  1201.  
  1202.     for(i = base_addr; len > 0; len--) 
  1203.         f[i++] |= LOADED;
  1204.  
  1205.     start_trace(base_addr+6, "**BOOT**");
  1206. }
  1207.  
  1208.  
  1209. loadfile()
  1210. {
  1211.     FILE *fp;
  1212.     int base_addr;
  1213.     int last_addr;
  1214.     register int i;
  1215.     int had_header;
  1216.     int tmp;
  1217.  
  1218.     had_header = 0;
  1219.     fp = fopen(file, "r");
  1220.     cur_file = NULL;
  1221.     if (!fp) { 
  1222.         fprintf(stderr, "Cant open %s\n", file);
  1223.  
  1224. #ifdef AMIGA
  1225. free(d);
  1226. free(f);
  1227. #endif
  1228.  
  1229.         exit(1);
  1230.     }
  1231.     for(;;) {
  1232.  
  1233.         i = getc(fp);
  1234.  
  1235.         if (i == EOF) {
  1236.             if (f[RUNLOC] & LOADED & f[RUNLOC+1]) {
  1237.                 i = getword(RUNLOC);
  1238.                 start_trace(i, "**RUN**");
  1239.             }
  1240.             return;
  1241.         }
  1242.  
  1243.         i = i | (getc(fp) << 8);
  1244.         if (i == 0xffff)  {
  1245.             had_header = 1;
  1246.             base_addr = getc(fp);
  1247.             base_addr = base_addr | (getc(fp) << 8);
  1248.             if (base_addr < 0 || base_addr > 0xffff) 
  1249.                 crash("Invalid base addr in input file");
  1250.         } else {
  1251.             if (!had_header)
  1252.                 crash("Invalid header in input file");
  1253.             base_addr = i;
  1254.         }
  1255.  
  1256.         last_addr = getc(fp);
  1257.         last_addr = last_addr | (getc(fp) << 8);
  1258.         if (last_addr < base_addr || last_addr > 0xffff) 
  1259.             crash("Invalid length in input file");
  1260.  
  1261.         printf("Load:  %4x -> %4x\n", base_addr, last_addr);
  1262.         for(i = base_addr; i <= last_addr; i++) {
  1263.             tmp = getc(fp);
  1264.             if (tmp == EOF) 
  1265.                 crash("File too small");
  1266.             d[i] = tmp;
  1267.             f[i] |= LOADED;
  1268.         }
  1269.  
  1270.         if (f[INITLOC] & LOADED & f[INITLOC+1])  {
  1271.             i = getword(INITLOC);
  1272.             start_trace(i, "**INIT**");
  1273.         }
  1274.  
  1275.         f[INITLOC] &= ~LOADED;
  1276.         f[INITLOC+1] &= ~LOADED;
  1277.     }
  1278.  
  1279. }
  1280.  
  1281.  
  1282. c64loadfile()
  1283. {
  1284.     FILE *fp;
  1285.     unsigned int base_addr,i;
  1286.     int c;
  1287.  
  1288.     fp = fopen(file, "r");
  1289.     cur_file = NULL;
  1290.     if (!fp) { 
  1291.         fprintf(stderr, "Cant open %s\n", file);
  1292.  
  1293. #ifdef AMIGA
  1294.         free(d);
  1295.         free(f);
  1296. #endif
  1297.  
  1298.         exit(1);
  1299.     }
  1300.  
  1301.     base_addr = getc(fp);
  1302.     i = ( base_addr += ( (unsigned int)getc(fp) << 8 ) );
  1303.  
  1304.     while( (c = getc(fp)) != EOF) {
  1305.         d[i] = c;
  1306.         f[i++] |= LOADED;
  1307.         }
  1308.  
  1309.     start_trace(base_addr, "**C64BIN**");
  1310. }
  1311.  
  1312.  
  1313. start_trace(loc, name)
  1314. unsigned int loc;
  1315. char *name;
  1316. {
  1317.     printf("Trace: %4x %s\n", loc, name);
  1318.     f[loc] |= (NAMED | SREF);
  1319.     if (!get_name(loc))
  1320.         save_name(loc, name);
  1321.     save_ref(0, loc);
  1322.     trace(loc);
  1323. }
  1324.     
  1325. trace(addr)
  1326. register unsigned int addr;
  1327. {
  1328.     int opcode;
  1329.     register struct info *ip; 
  1330.     int operand;
  1331.     int istart;
  1332.  
  1333.     if (f[addr] & TDONE)
  1334.         return;
  1335.     else 
  1336.         f[addr] |= TDONE;
  1337.  
  1338.     istart = addr;
  1339.     opcode = getbyte(addr);
  1340.     ip = &optbl[opcode];
  1341.  
  1342.     if (ip->flag & ILL)
  1343.         return;
  1344.  
  1345.     f[addr] |= ISOP;
  1346.  
  1347.     addr++;
  1348.  
  1349.     /* Get the operand */
  1350.  
  1351.     switch(ip->nb) {
  1352.         case 1:
  1353.             break;
  1354.         case 2:
  1355.             operand = getbyte(addr);
  1356.             f[addr++] |= TDONE;
  1357.             break;
  1358.         case 3:
  1359.             operand = getword(addr);
  1360.             f[addr++] |= TDONE;
  1361.             f[addr++] |= TDONE;
  1362.             break;
  1363.     }
  1364.  
  1365.     /* Mark data references */
  1366.  
  1367.     switch (ip->flag & ADRMASK) {
  1368.         case IMM:
  1369.         case ACC:
  1370.         case IMP:
  1371.         case REL:
  1372.         case IND:
  1373.             break;
  1374.         case ABS:
  1375.             if (ip->flag & (JUMP | FORK))
  1376.                 break;
  1377.             /* Fall into */
  1378.         case ABX:
  1379.         case ABY:
  1380.         case INX:
  1381.         case INY:
  1382.         case ZPG:
  1383.         case ZPX:
  1384.         case ZPY:
  1385.             f[operand] |= DREF;
  1386.             save_ref(istart, operand);
  1387.             break;
  1388.         default:
  1389.             crash("Optable error");
  1390.             break;
  1391.     }
  1392.  
  1393.     /* Trace the next instruction */
  1394.  
  1395.     switch (ip->flag & CTLMASK) {
  1396.         case NORM:
  1397.             trace(addr);
  1398.             break;
  1399.         case JUMP:
  1400.             f[operand] |= JREF;
  1401.             save_ref(istart, operand);
  1402.             trace(operand);
  1403.             break;
  1404.         case FORK:
  1405.             if (ip->flag & REL) {
  1406.                 if (operand > 127) 
  1407.                     operand = (~0xff | operand);
  1408.                 operand = operand + addr;
  1409.                 f[operand] |= JREF;
  1410.             } else {
  1411.                 f[operand] |= SREF;
  1412.             }
  1413.             save_ref(istart, operand);
  1414.             trace(operand);
  1415.             trace(addr);
  1416.             break;
  1417.         case STOP:
  1418.             break;
  1419.         default:
  1420.             crash("Optable error");
  1421.             break;
  1422.     }
  1423. }
  1424.  
  1425. int
  1426. yywrap()
  1427. {
  1428.     (void)fclose(yyin);
  1429.     if (npredef == pre_index) {
  1430.         return(1);
  1431.     } else  {
  1432.         lineno = 0;
  1433.         cur_file = predef[pre_index];
  1434.         pre_index++;
  1435.         yyin = fopen(cur_file, "r");
  1436.         if (!yyin) 
  1437.             crash("Can't open predefines file");
  1438.         return (0);
  1439.     }
  1440. }
  1441. SHAR_EOF
  1442. cat << \SHAR_EOF > print.c
  1443. #include <ctype.h>
  1444. #include "dis.h"
  1445.  
  1446. char *strcpy();
  1447. char *strcat();
  1448.  
  1449. dumpitout()
  1450. {
  1451.     int i;
  1452.  
  1453.     for(i = 0; i<0x10000;) {
  1454.         if (f[i] & LOADED) {
  1455.  
  1456.             if (f[i] & SREF && f[i] & ISOP)
  1457.                 printf("\n\n\n");
  1458.  
  1459.             printf("%04x  ",i);
  1460.             print_bytes(i);
  1461.             print_label(i);
  1462.             if (f[i] & ISOP)
  1463.                 i += print_inst(i);
  1464.             else
  1465.                 i += print_data(i);
  1466.             printf("\n");
  1467.  
  1468.         } else {
  1469.             i++;
  1470.         }
  1471.     }
  1472.  
  1473.     print_refs();
  1474. }
  1475.  
  1476. pchar(c)
  1477. int c;
  1478. {
  1479.     if (isascii(c) && isprint(c))
  1480.         return(c);
  1481.     return('.');
  1482. }
  1483.  
  1484. char *
  1485. lname(i)
  1486. int i;
  1487. {
  1488.     static char buf[20];
  1489.     char t;
  1490.  
  1491.     if (f[i] & NAMED) 
  1492.         return(get_name(i));
  1493.     if ((i > 0) && ((f[i-1] & (NAMED | DREF)) == (NAMED | DREF))) {
  1494.         (void)strcpy(buf, get_name(i-1));
  1495.         (void)strcat(buf, "+1");
  1496.         return (buf);
  1497.     }
  1498.     if (f[i] & SREF)
  1499.         t = 'S';
  1500.     else if (f[i] & JREF)
  1501.         t = 'L';
  1502.     else if (f[i] & DREF)
  1503.         t = 'D';
  1504.     else 
  1505.         t = 'X';
  1506.     
  1507.     (void)sprintf(buf, "%c%x", t, i);
  1508.     return (buf);
  1509. }
  1510.  
  1511. print_label(i)
  1512. {
  1513.     if (f[i] & (NAMED | JREF | SREF | DREF)) 
  1514.         printf("%-10s", lname(i));
  1515.     else
  1516.         printf("%10s"," ");
  1517. }
  1518.  
  1519. print_bytes(addr)
  1520. int addr;
  1521. {
  1522.     register struct info *ip; 
  1523.  
  1524.     if ((f[addr] & ISOP) == 0) {
  1525.         printf("           ");
  1526.         return;
  1527.     }
  1528.  
  1529.     ip = &optbl[getbyte(addr)];
  1530.  
  1531.     switch (ip->nb) {
  1532.         case 1:
  1533.             printf("%02x         ", getbyte(addr));
  1534.             break;
  1535.         case 2:
  1536.             printf("%02x %02x      ", getbyte(addr), getbyte(addr+1));
  1537.             break;
  1538.         case 3:
  1539.             printf("%02x %02x %02x   ", getbyte(addr), getbyte(addr+1), getbyte(addr+2));
  1540.             break;
  1541.     }
  1542. }
  1543.         
  1544.  
  1545. print_inst(addr)
  1546. int addr;
  1547. {
  1548.     int opcode;
  1549.     register struct info *ip; 
  1550.     int operand;
  1551.  
  1552.     opcode = getbyte(addr);
  1553.     ip = &optbl[opcode];
  1554.  
  1555.     printf("%s  ", ip->opn);
  1556.  
  1557.     addr++;
  1558.  
  1559.     switch(ip->nb) {
  1560.         case 1:
  1561.             break;
  1562.         case 2:
  1563.             operand = getbyte(addr);
  1564.             break;
  1565.         case 3:
  1566.             operand = getword(addr);
  1567.             break;
  1568.     }
  1569.  
  1570.     if (ip->flag & REL) {
  1571.         if (operand > 127) 
  1572.             operand = (~0xff | operand);
  1573.         operand = operand + ip->nb + addr - 1;
  1574.     }
  1575.  
  1576.     switch (ip->flag & ADRMASK) {
  1577.         case IMM:
  1578.             printf("#$%02x                        * %d %c", operand, operand, pchar(operand));
  1579.             break;
  1580.         case ACC:
  1581.         case IMP:
  1582.             break;
  1583.         case REL:
  1584.         case ABS:
  1585.         case ZPG:
  1586.             printf("%s ", lname(operand));
  1587.             break;
  1588.         case IND:
  1589.             printf("(%s) ", lname(operand));
  1590.             break;
  1591.         case ABX:
  1592.         case ZPX:
  1593.             printf("%s,X ", lname(operand));
  1594.             break;
  1595.         case ABY:
  1596.         case ZPY:
  1597.             printf("%s,Y ", lname(operand));
  1598.             break;
  1599.         case INX:
  1600.             printf("(%s,X) ", lname(operand));
  1601.             break;
  1602.         case INY:
  1603.             printf("(%s),Y", lname(operand));
  1604.             break;
  1605.         default:
  1606.             break;
  1607.     }
  1608.  
  1609.     return(ip->nb);
  1610.  
  1611. }
  1612.  
  1613. print_data(i)
  1614. {
  1615.     int count;
  1616.     int j;
  1617.     int start;
  1618.  
  1619.     start = i;
  1620.     printf(".DB  %02x ", getbyte(i));
  1621.     count = 1;
  1622.     i++;
  1623.  
  1624.     for (j = 1; j < 8; j++) {
  1625.         if (f[i] & (JREF | SREF | DREF) || ((f[i] & LOADED) == 0)) 
  1626.             break;
  1627.         else
  1628.             printf("%02x ", getbyte(i));
  1629.         i++;
  1630.         count++;
  1631.     }
  1632.     for (j = count; j < 8; j++)
  1633.         printf("   ");
  1634.  
  1635.     printf("    * ");
  1636.  
  1637.     for (j = start; j < i ; j++) 
  1638.             printf("%c", pchar((int)getbyte(j)));
  1639.  
  1640.     return (count);
  1641. }
  1642.  
  1643. print_refs()
  1644. {
  1645.     char tname[50];
  1646.     char cmd[200];
  1647.     FILE *fp;
  1648.     register struct ref_chain *rp;
  1649.     register int i;
  1650.     int npline;
  1651.  
  1652. #ifndef AMIGA
  1653.     (void)sprintf(tname, "dis.%d", getpid());
  1654.     (void)sprintf(cmd, "sort %s; rm %s", tname, tname);
  1655. #else
  1656.     (void)sprintf(tname, "dis.%ld", FindTask(0L));
  1657.     (void)sprintf(cmd, "Sort from %s to %s", tname, &tname[3] );
  1658. #endif
  1659.  
  1660.     fp = fopen(tname, "w");
  1661.     if (!fp) 
  1662.         crash("Cant open temporary file/n");
  1663.  
  1664.     for (i = 0; i<0x10000; i++) {
  1665.         if(f[i] & (JREF|SREF|DREF)) {
  1666.             rp = get_ref(i);
  1667.             if (!rp) {
  1668.                 fprintf(stderr, "No ref %d\n", i);
  1669.                 break;
  1670.             }
  1671.  
  1672.             fprintf(fp, "%-8s  %04x   ", lname(i), i);
  1673.             npline = 0;
  1674.             while (rp) {
  1675.                 fprintf(fp, "%04x ", rp->who);
  1676.                 npline++;
  1677.                 if (npline == 12) {
  1678.                     fprintf(fp,"\n");
  1679.                     fprintf(fp,"%-8s  %04x   ",lname(i),i);
  1680.                     npline = 0;
  1681.                 }
  1682.                 rp = rp->next;
  1683.             }
  1684.             fprintf(fp, "\n");
  1685.         }
  1686.  
  1687.     }
  1688.  
  1689.     (void)fclose(fp);
  1690.  
  1691.     printf("\n\n\n\n\nCross References\n\n");
  1692.     printf("%-8s  Value  References\n", "Symbol");
  1693.     (void)fflush (stdout);
  1694.  
  1695. #ifndef AMIGA
  1696.     (void)system(cmd);
  1697. #else
  1698.     (void)Execute(cmd,0L,0L);
  1699.     (void)sprintf(cmd, "Type %s",&tname[3]);
  1700.     (void)Execute(cmd,0L,Output());
  1701.     DeleteFile(tname);
  1702.     DeleteFile(&tname[3]);
  1703. #endif
  1704. }
  1705. SHAR_EOF
  1706. cat << \SHAR_EOF > ref.c
  1707. #include "dis.h"
  1708.  
  1709. #define HTSIZE 0x1000            /* Power of 2 */
  1710. #define HTMASK (HTSIZE-1)
  1711.  
  1712. struct hashslot {
  1713.     int addr;            /* The key */
  1714.     struct ref_chain *ref;        /* Who references it */
  1715.     char *name;            /* The symbolic name (if it has one) */
  1716. };
  1717.  
  1718. struct   hashslot hashtbl[HTSIZE];    /* the hash table */
  1719.  
  1720. struct hashslot *
  1721. hash(loc, allocate)
  1722. int loc;
  1723. int allocate;
  1724. {
  1725.     int probes;
  1726.     register struct hashslot *hp;
  1727.  
  1728.     hp = &hashtbl[loc & HTMASK];
  1729.     probes = 0;
  1730.  
  1731.     while (probes< HTSIZE) {
  1732.         if (hp->addr == loc)
  1733.             return(hp);
  1734.         if (hp->name == NULL && hp->ref == NULL) {
  1735.             if (allocate) {
  1736.                 hp->addr = loc;
  1737.                 return(hp);
  1738.             } else {
  1739.                 return(NULL);
  1740.             }
  1741.         }
  1742.         hp++;
  1743.         if (hp == &hashtbl[HTSIZE])
  1744.             hp = &hashtbl[0];
  1745.         probes++;
  1746.     }
  1747.  
  1748.     crash("Hash table full");
  1749.     /*NOTREACHED*/
  1750. }
  1751.  
  1752. save_ref(refer, refee) 
  1753. int refer;
  1754. int refee;
  1755. {
  1756.     struct ref_chain *rc;
  1757.     struct hashslot *hp;
  1758.  
  1759.     rc = (struct ref_chain *)emalloc(sizeof(*rc));
  1760.     rc->who = refer;
  1761.     hp = hash(refee, 1);
  1762.     rc->next = hp->ref;
  1763.     hp->ref = rc;
  1764. }
  1765.  
  1766. save_name(loc, name)
  1767. int loc;
  1768. char *name;
  1769. {
  1770.     struct hashslot *hp;
  1771.  
  1772.     hp = hash(loc, 1);
  1773.     hp->name = name;
  1774. }
  1775.  
  1776. struct ref_chain *
  1777. get_ref(loc)
  1778. {
  1779.     struct hashslot *hp;
  1780.  
  1781.     hp = hash(loc, 0);
  1782.     if (!hp) 
  1783.         return(NULL);
  1784.     return(hp->ref);
  1785. }
  1786.  
  1787. char *
  1788. get_name(loc)
  1789. {
  1790.     struct hashslot *hp;
  1791.  
  1792.     hp = hash(loc, 0);
  1793.     if (!hp) 
  1794.         return(NULL);
  1795.     return(hp->name);
  1796. }
  1797. SHAR_EOF
  1798. cat << \SHAR_EOF > tbl.c
  1799. #include "dis.h"
  1800.  
  1801. struct info optbl[256] = {
  1802.     /* 00 */    { { 'B', 'R', 'K', 0, },  1, IMP|STOP, },
  1803.     /* 01 */    { { 'O', 'R', 'A', 0, },  2, INX|NORM, },
  1804.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1805.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1806.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1807.     /* 05 */    { { 'O', 'R', 'A', 0, },  2, ZPG|NORM, },
  1808.     /* 06 */    { { 'A', 'S', 'L', 0, },  2, ZPG|NORM, },
  1809.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1810.     /* 08 */    { { 'P', 'H', 'P', 0, },  1, IMP|NORM, },
  1811.     /* 09 */    { { 'O', 'R', 'A', 0, },  2, IMM|NORM, },
  1812.     /* 0a */    { { 'A', 'S', 'L', 0, },  1, ACC|NORM, },
  1813.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1814.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1815.     /* 0d */    { { 'O', 'R', 'A', 0, },  3, ABS|NORM, },
  1816.     /* 0e */    { { 'A', 'S', 'L', 0, },  3, ABS|NORM, },
  1817.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1818.     /* 10 */    { { 'B', 'P', 'L', 0, },  2, REL|FORK, },
  1819.     /* 11 */    { { 'O', 'R', 'A', 0, },  2, INY|NORM, },
  1820.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1821.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1822.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1823.     /* 15 */    { { 'O', 'R', 'A', 0, },  2, ZPX|NORM, },
  1824.     /* 16 */    { { 'A', 'S', 'L', 0, },  2, ZPX|NORM, },
  1825.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1826.     /* 18 */    { { 'C', 'L', 'C', 0, },  1, IMP|NORM, },
  1827.     /* 19 */    { { 'O', 'R', 'A', 0, },  3, ABY|NORM, },
  1828.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1829.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1830.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1831.     /* 1d */    { { 'O', 'R', 'A', 0, },  3, ABX|NORM, },
  1832.     /* 1e */    { { 'A', 'S', 'L', 0, },  3, ABX|NORM, },
  1833.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1834.     /* 20 */    { { 'J', 'S', 'R', 0, },  3, ABS|FORK, },
  1835.     /* 21 */    { { 'A', 'N', 'D', 0, },  2, INX|NORM, },
  1836.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1837.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1838.     /* 24 */    { { 'B', 'I', 'T', 0, },  2, ZPG|NORM, },
  1839.     /* 25 */    { { 'A', 'N', 'D', 0, },  2, ZPG|NORM, },
  1840.     /* 26 */    { { 'R', 'O', 'L', 0, },  2, ZPG|NORM, },
  1841.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1842.     /* 28 */    { { 'P', 'L', 'P', 0, },  1, IMP|NORM, },
  1843.     /* 29 */    { { 'A', 'N', 'D', 0, },  2, IMM|NORM, },
  1844.     /* 2a */    { { 'R', 'O', 'L', 0, },  1, ACC|NORM, },
  1845.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1846.     /* 2c */    { { 'B', 'I', 'T', 0, },  3, ABS|NORM, },
  1847.     /* 2d */    { { 'A', 'N', 'D', 0, },  3, ABS|NORM, },
  1848.     /* 2e */    { { 'R', 'O', 'L', 0, },  3, ABS|NORM, },
  1849.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1850.     /* 30 */    { { 'B', 'M', 'I', 0, },  2, REL|FORK, },
  1851.     /* 31 */    { { 'A', 'N', 'D', 0, },  2, INY|NORM, },
  1852.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1853.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1854.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1855.     /* 35 */    { { 'A', 'N', 'D', 0, },  2, ZPX|NORM, },
  1856.     /* 36 */    { { 'R', 'O', 'L', 0, },  2, ZPX|NORM, },
  1857.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1858.     /* 38 */    { { 'S', 'E', 'C', 0, },  1, IMP|NORM, },
  1859.     /* 39 */    { { 'A', 'N', 'D', 0, },  3, ABY|NORM, },
  1860.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1861.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1862.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1863.     /* 3d */    { { 'A', 'N', 'D', 0, },  3, ABX|NORM, },
  1864.     /* 3e */    { { 'R', 'O', 'L', 0, },  3, ABX|NORM, },
  1865.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1866.     /* 40 */    { { 'R', 'T', 'I', 0, },  1, IMP|STOP, },
  1867.     /* 41 */    { { 'E', 'O', 'R', 0, },  2, INX|NORM, },
  1868.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1869.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1870.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1871.     /* 45 */    { { 'E', 'O', 'R', 0, },  2, ZPG|NORM, },
  1872.     /* 46 */    { { 'L', 'S', 'R', 0, },  2, ZPG|NORM, },
  1873.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1874.     /* 48 */    { { 'P', 'H', 'A', 0, },  1, IMP|NORM, },
  1875.     /* 49 */    { { 'E', 'O', 'R', 0, },  2, IMM|NORM, },
  1876.     /* 4a */    { { 'L', 'S', 'R', 0, },  1, ACC|NORM, },
  1877.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1878.     /* 4c */    { { 'J', 'M', 'P', 0, },  3, ABS|JUMP, },
  1879.     /* 4d */    { { 'E', 'O', 'R', 0, },  3, ABS|NORM, },
  1880.     /* 4e */    { { 'L', 'S', 'R', 0, },  3, ABS|NORM, },
  1881.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1882.     /* 50 */    { { 'B', 'V', 'C', 0, },  2, REL|FORK, },
  1883.     /* 51 */    { { 'E', 'O', 'R', 0, },  2, INY|NORM, },
  1884.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1885.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1886.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1887.     /* 55 */    { { 'E', 'O', 'R', 0, },  2, ZPX|NORM, },
  1888.     /* 56 */    { { 'L', 'S', 'R', 0, },  2, ZPX|NORM, },
  1889.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1890.     /* 58 */    { { 'C', 'L', 'I', 0, },  1, IMP|NORM, },
  1891.     /* 59 */    { { 'E', 'O', 'R', 0, },  3, ABY|NORM, },
  1892.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1893.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1894.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1895.     /* 5d */    { { 'E', 'O', 'R', 0, },  3, ABX|NORM, },
  1896.     /* 5e */    { { 'L', 'S', 'R', 0, },  3, ABX|NORM, },
  1897.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1898.     /* 60 */    { { 'R', 'T', 'S', 0, },  1, IMP|STOP, },
  1899.     /* 61 */    { { 'A', 'D', 'C', 0, },  2, INX|NORM, },
  1900.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1901.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1902.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1903.     /* 65 */    { { 'A', 'D', 'C', 0, },  2, ZPG|NORM, },
  1904.     /* 66 */    { { 'R', 'O', 'R', 0, },  2, ZPG|NORM, },
  1905.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1906.     /* 68 */    { { 'P', 'L', 'A', 0, },  1, IMP|NORM, },
  1907.     /* 69 */    { { 'A', 'D', 'C', 0, },  2, IMM|NORM, },
  1908.     /* 6a */    { { 'R', 'O', 'R', 0, },  1, ACC|NORM, },
  1909.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1910.     /* 6c */    { { 'J', 'M', 'P', 0, },  3, IND|STOP, },
  1911.     /* 6d */    { { 'A', 'D', 'C', 0, },  3, ABS|NORM, },
  1912.     /* 6e */    { { 'R', 'O', 'R', 0, },  3, ABS|NORM, },
  1913.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1914.     /* 70 */    { { 'B', 'V', 'S', 0, },  2, REL|FORK, },
  1915.     /* 71 */    { { 'A', 'D', 'C', 0, },  2, INY|NORM, },
  1916.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1917.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1918.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1919.     /* 75 */    { { 'A', 'D', 'C', 0, },  2, ZPX|NORM, },
  1920.     /* 76 */    { { 'R', 'O', 'R', 0, },  2, ZPX|NORM, },
  1921.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1922.     /* 78 */    { { 'S', 'E', 'I', 0, },  1, IMP|NORM, },
  1923.     /* 79 */    { { 'A', 'D', 'C', 0, },  3, ABY|NORM, },
  1924.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1925.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1926.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1927.     /* 7d */    { { 'A', 'D', 'C', 0, },  3, ABX|NORM, },
  1928.     /* 7e */    { { 'R', 'O', 'R', 0, },  3, ABX|NORM, },
  1929.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1930.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1931.     /* 81 */    { { 'S', 'T', 'A', 0, },  2, INX|NORM, },
  1932.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1933.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1934.     /* 84 */    { { 'S', 'T', 'Y', 0, },  2, ZPG|NORM, },
  1935.     /* 85 */    { { 'S', 'T', 'A', 0, },  2, ZPG|NORM, },
  1936.     /* 86 */    { { 'S', 'T', 'X', 0, },  2, ZPG|NORM, },
  1937.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1938.     /* 88 */    { { 'D', 'E', 'Y', 0, },  1, IMP|NORM, },
  1939.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1940.     /* 8a */    { { 'T', 'X', 'A', 0, },  1, IMP|NORM, },
  1941.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1942.     /* 8c */    { { 'S', 'T', 'Y', 0, },  3, ABS|NORM, },
  1943.     /* 8d */    { { 'S', 'T', 'A', 0, },  3, ABS|NORM, },
  1944.     /* 8e */    { { 'S', 'T', 'X', 0, },  3, ABS|NORM, },
  1945.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1946.     /* 90 */    { { 'B', 'C', 'C', 0, },  2, REL|FORK, },
  1947.     /* 91 */    { { 'S', 'T', 'A', 0, },  2, INY|NORM, },
  1948.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1949.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1950.     /* 94 */    { { 'S', 'T', 'Y', 0, },  2, ZPX|NORM, },
  1951.     /* 95 */    { { 'S', 'T', 'A', 0, },  2, ZPX|NORM, },
  1952.     /* 96 */    { { 'S', 'T', 'X', 0, },  2, ZPY|NORM, },
  1953.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1954.     /* 98 */    { { 'T', 'Y', 'A', 0, },  1, IMP|NORM, },
  1955.     /* 99 */    { { 'S', 'T', 'A', 0, },  3, ABY|NORM, },
  1956.     /* 9a */    { { 'T', 'X', 'S', 0, },  1, IMP|NORM, },
  1957.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1958.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1959.     /* 9d */    { { 'S', 'T', 'A', 0, },  3, ABX|NORM, },
  1960.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1961.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1962.     /* a0 */    { { 'L', 'D', 'Y', 0, },  2, IMM|NORM, },
  1963.     /* a1 */    { { 'L', 'D', 'A', 0, },  2, INX|NORM, },
  1964.     /* a2 */    { { 'L', 'D', 'X', 0, },  2, IMM|NORM, },
  1965.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1966.     /* a4 */    { { 'L', 'D', 'Y', 0, },  2, ZPG|NORM, },
  1967.     /* a5 */    { { 'L', 'D', 'A', 0, },  2, ZPG|NORM, },
  1968.     /* a6 */    { { 'L', 'D', 'X', 0, },  2, ZPG|NORM, },
  1969.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1970.     /* a8 */    { { 'T', 'A', 'Y', 0, },  1, IMP|NORM, },
  1971.     /* a9 */    { { 'L', 'D', 'A', 0, },  2, IMM|NORM, },
  1972.     /* aa */    { { 'T', 'A', 'X', 0, },  1, IMP|NORM, },
  1973.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1974.     /* ac */    { { 'L', 'D', 'Y', 0, },  3, ABS|NORM, },
  1975.     /* ad */    { { 'L', 'D', 'A', 0, },  3, ABS|NORM, },
  1976.     /* ae */    { { 'L', 'D', 'X', 0, },  3, ABS|NORM, },
  1977.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1978.     /* b0 */    { { 'B', 'C', 'S', 0, },  2, REL|FORK, },
  1979.     /* b1 */    { { 'L', 'D', 'A', 0, },  2, INY|NORM, },
  1980.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1981.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1982.     /* b4 */    { { 'L', 'D', 'Y', 0, },  2, ZPX|NORM, },
  1983.     /* b5 */    { { 'L', 'D', 'A', 0, },  2, ZPX|NORM, },
  1984.     /* b6 */    { { 'L', 'D', 'X', 0, },  2, ZPY|NORM, },
  1985.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1986.     /* b8 */    { { 'C', 'L', 'V', 0, },  1, IMP|NORM, },
  1987.     /* b9 */    { { 'L', 'D', 'A', 0, },  3, ABY|NORM, },
  1988.     /* ba */    { { 'T', 'S', 'X', 0, },  1, IMP|NORM, },
  1989.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1990.     /* bc */    { { 'L', 'D', 'Y', 0, },  3, ABX|NORM, },
  1991.     /* bd */    { { 'L', 'D', 'A', 0, },  3, ABX|NORM, },
  1992.     /* be */    { { 'L', 'D', 'X', 0, },  3, ABY|NORM, },
  1993.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1994.     /* c0 */    { { 'C', 'P', 'Y', 0, },  2, IMM|NORM, },
  1995.     /* c1 */    { { 'C', 'M', 'P', 0, },  2, INX|NORM, },
  1996.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1997.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  1998.     /* c4 */    { { 'C', 'P', 'Y', 0, },  2, ZPG|NORM, },
  1999.     /* c5 */    { { 'C', 'M', 'P', 0, },  2, ZPG|NORM, },
  2000.     /* c6 */    { { 'D', 'E', 'C', 0, },  2, ZPG|NORM, },
  2001.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2002.     /* c8 */    { { 'I', 'N', 'Y', 0, },  1, IMP|NORM, },
  2003.     /* c9 */    { { 'C', 'M', 'P', 0, },  2, IMM|NORM, },
  2004.     /* ca */    { { 'D', 'E', 'X', 0, },  1, IMP|NORM, },
  2005.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2006.     /* cc */    { { 'C', 'P', 'Y', 0, },  3, ABS|NORM, },
  2007.     /* cd */    { { 'C', 'M', 'P', 0, },  3, ABS|NORM, },
  2008.     /* ce */    { { 'D', 'E', 'C', 0, },  3, ABS|NORM, },
  2009.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2010.     /* d0 */    { { 'B', 'N', 'E', 0, },  2, REL|FORK, },
  2011.     /* d1 */    { { 'C', 'M', 'P', 0, },  2, INY|NORM, },
  2012.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2013.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2014.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2015.     /* d5 */    { { 'C', 'M', 'P', 0, },  2, ZPX|NORM, },
  2016.     /* d6 */    { { 'D', 'E', 'C', 0, },  2, ZPX|NORM, },
  2017.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2018.     /* d8 */    { { 'C', 'L', 'D', 0, },  1, IMP|NORM, },
  2019.     /* d9 */    { { 'C', 'M', 'P', 0, },  3, ABY|NORM, },
  2020.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2021.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2022.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2023.     /* dd */    { { 'C', 'M', 'P', 0, },  3, ABX|NORM, },
  2024.     /* de */    { { 'D', 'E', 'C', 0, },  3, ABX|NORM, },
  2025.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2026.     /* e0 */    { { 'C', 'P', 'X', 0, },  2, IMM|NORM, },
  2027.     /* e1 */    { { 'S', 'B', 'C', 0, },  2, INX|NORM, },
  2028.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2029.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2030.     /* e4 */    { { 'C', 'P', 'X', 0, },  2, ZPG|NORM, },
  2031.     /* e5 */    { { 'S', 'B', 'C', 0, },  2, ZPG|NORM, },
  2032.     /* e6 */    { { 'I', 'N', 'C', 0, },  2, ZPG|NORM, },
  2033.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2034.     /* e8 */    { { 'I', 'N', 'X', 0, },  1, IMP|NORM, },
  2035.     /* e9 */    { { 'S', 'B', 'C', 0, },  2, IMM|NORM, },
  2036.     /* ea */    { { 'N', 'O', 'P', 0, },  1, IMP|NORM, },
  2037.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2038.     /* ec */    { { 'C', 'P', 'X', 0, },  3, ABS|NORM, },
  2039.     /* ed */    { { 'S', 'B', 'C', 0, },  3, ABS|NORM, },
  2040.     /* ee */    { { 'I', 'N', 'C', 0, },  3, ABS|NORM, },
  2041.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2042.     /* f0 */    { { 'B', 'E', 'Q', 0, },  2, REL|FORK, },
  2043.     /* f1 */    { { 'S', 'B', 'C', 0, },  2, INY|NORM, },
  2044.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2045.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2046.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2047.     /* f5 */    { { 'S', 'B', 'C', 0, },  2, ZPX|NORM, },
  2048.     /* f6 */    { { 'I', 'N', 'C', 0, },  2, ZPX|NORM, },
  2049.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2050.     /* f8 */    { { 'S', 'E', 'D', 0, },  1, IMP|NORM, },
  2051.     /* f9 */    { { 'S', 'B', 'C', 0, },  3, ABY|NORM, },
  2052.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2053.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2054.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2055.     /* fd */    { { 'S', 'B', 'C', 0, },  3, ABX|NORM, },
  2056.     /* fe */    { { 'I', 'N', 'C', 0, },  3, ABX|NORM, },
  2057.     /* 00 */    { { '?', '?', '?', 0, },  1, ILL|NORM, },
  2058. };
  2059. SHAR_EOF
  2060. #    End of shell archive
  2061. exit 0
  2062. -- 
  2063. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  2064. Have five nice days.
  2065.